<?php
/**
 * licenses : MIT
 * creatTime: 2020/5/14
 * author : weblinuxgame
 * filename: App.php
 */

namespace App\WebSocket;

use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
use Swoole\WebSocket\Server;
use Hhxsv5\LaravelS\Swoole\WebSocketHandlerInterface;

/**
 * @see https://wiki.swoole.com/#/start/start_ws_server
 */
class App implements WebSocketHandlerInterface
{
    protected $parser;

    // 声明没有参数的构造函数
    public function __construct()
    {
        $this->parser = new SocketIoParser();
    }

    public function onOpen(Server $server, Request $request)
    {
        // 在触发onOpen事件之前，建立WebSocket的HTTP请求已经经过了Laravel的路由，
        // 所以Laravel的Request、Auth等信息是可读的，Session是可读写的，但仅限在onOpen事件中。
        // \Log::info('New WebSocket connection', [$request->fd, request()->all(), session()->getId(), session('xxx'), session(['yyy' => time()])]);
        $this->parser()->onOpen($server, $request);
        // throw new \Exception('an exception');// 此时抛出的异常上层会忽略，并记录到Swoole日志，需要开发者try/catch捕获处理
    }

    public function onMessage(Server $server, Frame $frame)
    {
        // \Log::info('Received message', [$frame->fd, $frame->data, $frame->opcode, $frame->finish]);
        $this->parser()->onMessage($server, $frame);
        // throw new \Exception('an exception');// 此时抛出的异常上层会忽略，并记录到Swoole日志，需要开发者try/catch捕获处理
    }

    public function onClose(Server $server, $fd, $reactorId)
    {
        $this->parser()->onClose($server, $fd);
        // throw new \Exception('an exception');// 此时抛出的异常上层会忽略，并记录到Swoole日志，需要开发者try/catch捕获处理
    }

    /**
     * @return SocketIoParser
     */
    public function parser()
    {
        if (empty($this->parser)) {
            return new SocketIoParser();
        }
        return $this->parser;
    }

}
